Implement the I/O bitmap vm execution control.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Mon, 25 Jul 2005 21:02:09 +0000 (21:02 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Mon, 25 Jul 2005 21:02:09 +0000 (21:02 +0000)
With this patch, we should not bee seeing any vmexits for debug port
accesses.

Signed-off-by: Edwin Zhai <edwin.zhai@intel.com>
Signed-off-by: Arun Sharma <arun.sharma@intel.com>
xen/arch/x86/domain.c
xen/arch/x86/vmx.c
xen/arch/x86/vmx_vmcs.c
xen/include/asm-x86/vmx.h
xen/include/asm-x86/vmx_vmcs.h

index d28e5683f7207bec301359b4f09ee7641a5d4484..712a8888f58697a7f9f4c30fb0b87655a87edace 100644 (file)
@@ -373,6 +373,14 @@ static int vmx_final_setup_guest(
 
 out:
     free_vmcs(vmcs);
+    if(v->arch.arch_vmx.io_bitmap_a != 0) {
+        free_xenheap_pages(v->arch.arch_vmx.io_bitmap_a, get_order(0x1000));
+        v->arch.arch_vmx.io_bitmap_a = 0;
+    }
+    if(v->arch.arch_vmx.io_bitmap_b != 0) {
+        free_xenheap_pages(v->arch.arch_vmx.io_bitmap_b, get_order(0x1000));
+        v->arch.arch_vmx.io_bitmap_b = 0;
+    }
     v->arch.arch_vmx.vmcs = 0;
     return error;
 }
@@ -926,6 +934,14 @@ static void vmx_relinquish_resources(struct vcpu *v)
 
     BUG_ON(v->arch.arch_vmx.vmcs == NULL);
     free_vmcs(v->arch.arch_vmx.vmcs);
+    if(v->arch.arch_vmx.io_bitmap_a != 0) {
+        free_xenheap_pages(v->arch.arch_vmx.io_bitmap_a, get_order(0x1000));
+        v->arch.arch_vmx.io_bitmap_a = 0;
+    }
+    if(v->arch.arch_vmx.io_bitmap_b != 0) {
+        free_xenheap_pages(v->arch.arch_vmx.io_bitmap_b, get_order(0x1000));
+        v->arch.arch_vmx.io_bitmap_b = 0;
+    }
     v->arch.arch_vmx.vmcs = 0;
     
     free_monitor_pagetable(v);
index 17c6d559bc4aef2cbe473c07e287e7eba5bdb215..714049ae1133512f5f3fb0e4abff434cf0d2b736 100644 (file)
@@ -609,11 +609,6 @@ static void vmx_io_instruction(struct cpu_user_regs *regs,
     else
         addr = regs->edx & 0xffff;
 
-    if (addr == 0x80) {
-        __update_guest_eip(inst_len);
-        return;
-    }
-
     vio = get_vio(d->domain, d->vcpu_id);
     if (vio == 0) {
         printk("bad shared page: %lx", (unsigned long) vio);
index b7277e08c9bd575d241568b7d00675d6e0f24a9e..c4bb82437c76e6942165f482b8c3c53ca90f2613 100644 (file)
@@ -59,9 +59,11 @@ void free_vmcs(struct vmcs_struct *vmcs)
     free_xenheap_pages(vmcs, order);
 }
 
-static inline int construct_vmcs_controls(void)
+static inline int construct_vmcs_controls(struct arch_vmx_struct *arch_vmx)
 {
     int error = 0;
+    void *io_bitmap_a;
+    void *io_bitmap_b;
 
     error |= __vmwrite(PIN_BASED_VM_EXEC_CONTROL, 
                        MONITOR_PIN_BASED_EXEC_CONTROLS);
@@ -73,6 +75,20 @@ static inline int construct_vmcs_controls(void)
 
     error |= __vmwrite(VM_ENTRY_CONTROLS, MONITOR_VM_ENTRY_CONTROLS);
 
+    /* need to use 0x1000 instead of PAGE_SIZE */
+    io_bitmap_a = (void*) alloc_xenheap_pages(get_order(0x1000)); 
+    io_bitmap_b = (void*) alloc_xenheap_pages(get_order(0x1000)); 
+    memset(io_bitmap_a, 0xff, 0x1000);
+    /* don't bother debug port access */
+    clear_bit(PC_DEBUG_PORT, io_bitmap_a);
+    memset(io_bitmap_b, 0xff, 0x1000);
+
+    error |= __vmwrite(IO_BITMAP_A, (u64) virt_to_phys(io_bitmap_a));
+    error |= __vmwrite(IO_BITMAP_B, (u64) virt_to_phys(io_bitmap_b));
+
+    arch_vmx->io_bitmap_a = io_bitmap_a;
+    arch_vmx->io_bitmap_b = io_bitmap_b;
+
     return error;
 }
 
@@ -432,7 +448,7 @@ int construct_vmcs(struct arch_vmx_struct *arch_vmx,
                (unsigned long) vmcs_phys_ptr);
         return -EINVAL; 
     }
-    if ((error = construct_vmcs_controls())) {
+    if ((error = construct_vmcs_controls(arch_vmx))) {
         printk("construct_vmcs: construct_vmcs_controls failed\n");
         return -EINVAL;         
     }
index 36ef003de831546ed205637b06a7da5c62c3adc7..5596549ce1b85199d79d14351b26eadb0b7e1100 100644 (file)
@@ -61,6 +61,7 @@ extern unsigned int cpu_rev;
     CPU_BASED_INVDPG_EXITING | \
     CPU_BASED_MWAIT_EXITING | \
     CPU_BASED_MOV_DR_EXITING | \
+    CPU_BASED_ACTIVATE_IO_BITMAP | \
     CPU_BASED_UNCOND_IO_EXITING \
     )
 
index 93cdb48127cf4d63a60fb94b95faef6f0736e19e..68db612665190e98ab2623f30ea02e93dd27bc73 100644 (file)
@@ -69,6 +69,8 @@ struct msr_state{
     unsigned long shadow_gs;
 };
 
+#define PC_DEBUG_PORT   0x80 
+
 struct arch_vmx_struct {
     struct vmcs_struct      *vmcs;  /* VMCS pointer in virtual */
     unsigned long           flags;  /* VMCS flags */
@@ -76,6 +78,7 @@ struct arch_vmx_struct {
     unsigned long           cpu_cr3;
     unsigned long           cpu_state;
     struct msr_state        msr_content;
+    void                   *io_bitmap_a, *io_bitmap_b;
 };
 
 #define vmx_schedule_tail(next)         \